// FMC4030-Dll.h
#pragma once

#ifdef FMC4030_EXPORTS
#define FMC4030_API __declspec(dllexport)
#else
#define FMC4030_API __declspec(dllimport)
#endif

#include <windows.h>


// 返回值定义
enum FMC4030_ReturnCode {
    FMC4030_SUCCESS = 0,        // 执行成功
    FMC4030_CONNECT_FAIL = -1,  // 连接失败
    FMC4030_DATA_FAIL = -4,     // 数据建立失败
    FMC4030_SEND_FAIL = -5,     // 数据发送失败
    FMC4030_RECV_FAIL = -6,     // 数据接收失败
    FMC4030_DATA_ERROR = -7,    // 接收数据错误
    FMC4030_NULL_PTR = -8       // 空指针错误
};

// 轴定义
enum FMC4030_Axis {
    AXIS_X = 0,  // X轴
    AXIS_Y = 1,  // Y轴
    AXIS_Z = 2   // Z轴
};

// 运动模式
enum FMC4030_MotionMode {
    RELATIVE_MOTION = 1,  // 相对运动
    ABSOLUTE_MOTION = 2   // 绝对运动
};

// 停止模式
enum FMC4030_StopMode {
    DECEL_STOP = 1,  // 减速停止
    IMMEDIATE_STOP = 2  // 立即停止
};

// 回零方向
enum FMC4030_HomeDir {
    HOME_POSITIVE = 1,  // 正限位回零
    HOME_NEGATIVE = 2   // 负限位回零
};

// 圆弧插补方向
enum FMC4030_ArcDir {
    ARC_CW = 1,  // 顺时针
    ARC_CCW = 2  // 逆时针
};

// IO定义
enum FMC4030_IO {
    IO_OUT0 = 0,  // 输出口0
    IO_OUT1 = 1,  // 输出口1
    IO_OUT2 = 2,  // 输出口2
    IO_OUT3 = 3,  // 输出口3
    IO_IN0 = 0,   // 输入口0
    IO_IN1 = 1,   // 输入口1
    IO_IN2 = 2,   // 输入口2
    IO_IN3 = 3    // 输入口3
};

// IO状态
enum FMC4030_IOState {
    IO_HIGH = 0,  // 高电平
    IO_LOW = 1    // 低电平
};

#ifdef __cplusplus
extern "C" {
#endif

    /**
     * @brief 连接控制器
     * @param id 控制器ID号(0-255)
     * @param ip 控制器IP地址
     * @param port 控制器端口号
     * @return 执行结果
     */
    FMC4030_API int FMC4030_Open_Device(int id, const char* ip, int port);

    /**
     * @brief 断开控制器连接
     * @param id 控制器ID号
     * @return 执行结果
     */
    FMC4030_API int FMC4030_Close_Device(int id);

    /**
     * @brief 单轴运动
     * @param id 控制器ID号
     * @param axis 轴号(0:X,1:Y,2:Z)
     * @param pos 运动距离(mm)
     * @param speed 运动速度(mm/s)
     * @param acc 加速度(mm/s²)
     * @param dec 减速度(mm/s²)
     * @param mode 运动模式(1:相对,2:绝对)
     * @return 执行结果
     */
    FMC4030_API int FMC4030_Jog_Single_Axis(int id, int axis, float pos, float speed, float acc, float dec, int mode);

    /**
     * @brief 检查轴是否停止
     * @param id 控制器ID号
     * @param axis 轴号
     * @return 1:停止,0:运行中
     */
    FMC4030_API int FMC4030_Check_Axis_Is_Stop(int id, int axis);

    /**
     * @brief 单轴回零
     * @param id 控制器ID号
     * @param axis 轴号
     * @param homeSpeed 回零速度(mm/s)
     * @param homeAccDec 回零加减速度(mm/s²)
     * @param homeFallStep 回零脱落距离(mm)
     * @param homeDir 回零方向(1:正限位,2:负限位)
     * @return 执行结果
     */
    FMC4030_API int FMC4030_Home_Single_Axis(int id, int axis, float homeSpeed, float homeAccDec, float homeFallStep, int homeDir);

    /**
     * @brief 停止单轴运动
     * @param id 控制器ID号
     * @param axis 轴号
     * @param mode 停止模式(1:减速停止,2:立即停止)
     * @return 执行结果
     */
    FMC4030_API int FMC4030_Stop_Single_Axis(int id, int axis, int mode);

    /**
     * @brief 获取轴当前位置
     * @param id 控制器ID号
     * @param axis 轴号
     * @param pos 当前位置指针(输出参数)
     * @return 执行结果
     */
    FMC4030_API int FMC4030_Get_Axis_Current_Pos(int id, int axis, float* pos);

    /**
     * @brief 获取轴当前速度
     * @param id 控制器ID号
     * @param axis 轴号
     * @param speed 当前速度指针(输出参数)
     * @return 执行结果
     */
    FMC4030_API int FMC4030_Get_Axis_Current_Speed(int id, int axis, float* speed);

    /**
     * @brief 设置输出口状态
     * @param id 控制器ID号
     * @param io 输出口号(0-3)
     * @param status 输出状态(0:高电平,1:低电平)
     * @return 执行结果
     */
    FMC4030_API int FMC4030_Set_Output(int id, int io, int status);

    /**
     * @brief 获取输入口状态
     * @param id 控制器ID号
     * @param io 输入口号(0-3)
     * @param status 输入状态指针(输出参数)
     * @return 执行结果
     */
    FMC4030_API int FMC4030_Get_Input(int id, int io, int* status);

    /**
     * @brief 通过485总线发送数据
     * @param id 控制器ID号
     * @param data 待发送数据指针
     * @param length 数据长度
     * @return 执行结果
     */
    FMC4030_API int FMC4030_Write_Data_To_485(int id, const char* data, int length);

    /**
     * @brief 从485总线读取数据
     * @param id 控制器ID号
     * @param data 接收数据缓冲区
     * @param length 数据长度指针(输入输出参数)
     * @return 执行结果
     */
    FMC4030_API int FMC4030_Read_Data_From_485(int id, char* data, int* length);

    /**
     * @brief 设置单轴控制器速度(通过485总线)
     * @param id 控制器ID号
     * @param slaveId 从机地址
     * @param speed 目标速度(mm/s)
     * @return 执行结果
     */
    FMC4030_API int FMC4030_Set_FSC_Speed(int id, int slaveId, float speed);

    /**
     * @brief 两轴直线插补
     * @param id 控制器ID号
     * @param axis 轴选择(0x03:X/Y,0x05:X/Z,0x06:Y/Z)
     * @param endX 终点X坐标(mm)
     * @param endY 终点Y坐标(mm)
     * @param speed 合成速度(mm/s)
     * @param acc 合成加速度(mm/s²)
     * @param dec 合成减速度(mm/s²)
     * @return 执行结果
     */
    FMC4030_API int FMC4030_Line_2Axis(int id, unsigned int axis, float endX, float endY, float speed, float acc, float dec);

    /**
     * @brief 三轴直线插补
     * @param id 控制器ID号
     * @param axis 轴选择(任意值)
     * @param endX 终点X坐标(mm)
     * @param endY 终点Y坐标(mm)
     * @param endZ 终点Z坐标(mm)
     * @param speed 合成速度(mm/s)
     * @param acc 合成加速度(mm/s²)
     * @param dec 合成减速度(mm/s²)
     * @return 执行结果
     */
    FMC4030_API int FMC4030_Line_3Axis(int id, unsigned int axis, float endX, float endY, float endZ, float speed, float acc, float dec);

    /**
     * @brief 两轴圆弧插补
     * @param id 控制器ID号
     * @param axis 轴选择(0x03:X/Y,0x05:X/Z,0x06:Y/Z)
     * @param endX 终点X坐标(mm)
     * @param endY 终点Y坐标(mm)
     * @param centerX 圆心X坐标(mm)
     * @param centerY 圆心Y坐标(mm)
     * @param radius 圆弧半径(mm)
     * @param speed 合成速度(mm/s)
     * @param acc 合成加速度(mm/s²)
     * @param dec 合成减速度(mm/s²)
     * @param dir 插补方向(1:顺时针,2:逆时针)
     * @return 执行结果
     */
    FMC4030_API int FMC4030_Arc_2Axis(int id, unsigned int axis, float endX, float endY, float centerX, float centerY, float radius, float speed, float acc, float dec, int dir);

    /**
     * @brief 停止插补运动
     * @param id 控制器ID号
     * @return 执行结果
     */
    FMC4030_API int FMC4030_Stop_Run(int id);

    /**
     * @brief 获取设备状态
     * @param id 控制器ID号
     * @param machineData 设备状态结构体指针
     * @return 执行结果
     */
    FMC4030_API int FMC4030_Get_Machine_Status(int id, unsigned char* machineData);

    /**
     * @brief 获取设备参数
     * @param id 控制器ID号
     * @param devicePara 设备参数结构体指针
     * @return 执行结果
     */
    FMC4030_API int FMC4030_Get_Device_Para(int id, unsigned char* devicePara);

    /**
     * @brief 设置设备参数
     * @param id 控制器ID号
     * @param devicePara 设备参数结构体指针
     * @return 执行结果
     */
    FMC4030_API int FMC4030_Set_Device_Para(int id, unsigned char* devicePara);

#ifdef __cplusplus
}
#endif